package com.liinxin.flac_management.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class WorkManage {

    /**
     * 根据作品地址获取一个作品的所有内容
     *
     * @param work
     */
    public static List<File> getOneWorkContentsByPath(File work) {
        List<File> result = new ArrayList<File>();

        File[] contents = FileUtil.ls(work.getPath());
        for (int i = 0; i < contents.length; i++) {
            if (FileUtil.isFile(contents[i])) {
                result.add(contents[i]);
            }
        }
        return result;
    }

    /**
     * 根据传入的作品内容, 进行分类收集
     *
     * @param work
     */
    public static void classifyWorkContent(File work) {
        // 输出作品名称
        System.out.println("作品: ----" + FileNameUtil.mainName(work.getPath()) + "----");

        List<File> workContents = WorkManage.getOneWorkContentsByPath(work);

        // 判断文件类型, 类型暂定为图片和音频
        List<File> songs = new ArrayList<>();
        List<File> img = new ArrayList<>();
        for (int i = 0; i < workContents.size(); i++) {
            // 判断音频和图片
            if (SongManage.isSong(workContents.get(i))) {
                songs.add(workContents.get(i));
            } else if (ImgManage.isImg(workContents.get(i))) {
                img.add(workContents.get(i));
            }
        }
        // 截取文件封面, 宽度自动, 高度500, 默认获取第一张图片作为歌曲封面
        File imgCover = ImgManage.createImgCover(img.get(0).getPath(), FileManage.getPrePath(img.get(0).getPath()), 500);

        // 根据歌曲和图片集合分类管理, 图片需要放在高画质文件夹, 音频不需要移动
        // 处理图片
        String imgDir = FileManage.getPrePath(img.get(0).getPath()) + "高画质";
        for (int i = 0; i < img.size(); i++) {
            FileManage.copyToDestDir(img.get(i).getPath(), imgDir, img);
        }
        FileManage.delFileList(img);

        // 将wav文件收集到文件夹
        /*String wavDir = FileManage.getPrePath(songs.get(0).getPath()) + "wav";
        for (int i = 0; i < songs.size(); i++) {
            FileManage.copyToDestDir(songs.get(i).getPath(), wavDir, songs);
        }*/

        // 歌曲处理, 判断是否为wav格式的音频, 如果为wav格式的音频就转换为flac格式
        List<File> flacList = SongManage.listToFlacByThreaded(songs);

        // 删除wav文件
        FileManage.delFileList(songs);

        // 设置歌曲封面
        SongManage.setFlacCover(flacList, imgCover);

        // 设置歌曲标签
        SongManage.setSongTags(flacList);

        System.out.println("分类成功: " + work.getPath());
        System.out.println("作品: ----" + FileNameUtil.mainName(work.getPath()) + "----");
        System.out.println();
        System.out.println();
    }

    /**
     * 自定义线程
     *
     * @param work
     * @param numThread
     */
    public static void classifyWorkContent(File work, int numThread) throws IOException, InterruptedException {
        // 输出作品名称
        System.out.println("作品: ----" + FileNameUtil.mainName(work.getPath()) + "----");

        List<File> workContents = WorkManage.getOneWorkContentsByPath(work);

        // 判断文件类型, 类型暂定为图片和音频
        List<File> songs = new ArrayList<>();
        List<File> img = new ArrayList<>();
        for (int i = 0; i < workContents.size(); i++) {
            // 判断音频和图片
            if (SongManage.isSong(workContents.get(i))) {
                songs.add(workContents.get(i));
            } else if (ImgManage.isImg(workContents.get(i))) {
                img.add(workContents.get(i));
            }
        }
        // 截取文件封面, 宽度自动, 高度500, 默认获取第一张图片作为歌曲封面
        File imgCover = ImgManage.createImgCover(img.get(0).getPath(), FileManage.getPrePath(img.get(0).getPath()), 500);

        // 根据歌曲和图片集合分类管理, 图片需要放在高画质文件夹, 音频不需要移动
        // 处理图片
        String imgDir = FileManage.getPrePath(img.get(0).getPath()) + "高画质";
        for (int i = 0; i < img.size(); i++) {
            FileManage.copyToDestDir(img.get(i).getPath(), imgDir, img);
        }
        FileManage.delFileList(img);

        // 将wav文件收集到文件夹
        /*String wavDir = FileManage.getPrePath(songs.get(0).getPath()) + "wav";
        for (int i = 0; i < songs.size(); i++) {
            FileManage.copyToDestDir(songs.get(i).getPath(), wavDir, songs);
        }*/

        // 歌曲处理, 判断是否为wav格式的音频, 如果为wav格式的音频就转换为flac格式
        List<File> flacList = SongManage.listToFlacByThreaded(songs, numThread);

        // 删除wav文件
        FileManage.delFileList(songs);

        // 设置歌曲封面
        SongManage.setFlacCover(flacList, imgCover);

        // 设置歌曲标签
        SongManage.setSongTags(flacList);

        System.out.println("分类成功: " + work.getPath());
        System.out.println("作品: ----" + FileNameUtil.mainName(work.getPath()) + "----");
        System.out.println();
        System.out.println();

    }

    public static void classifyWorkContentWithFlac(File flacWorkSrc) {
        // 输出作品名称
        System.out.println("作品: ----" + FileNameUtil.mainName(flacWorkSrc.getPath()) + "----");

        List<File> workContents = WorkManage.getOneWorkContentsByPath(flacWorkSrc);

        // 判断文件类型, 类型暂定为图片和音频
        List<File> flacList = new ArrayList<>();
        List<File> img = new ArrayList<>();
        File imgCover = null;


        for (int i = 0; i < workContents.size(); i++) {
            // 判断音频和图片
            if (SongManage.isSong(workContents.get(i))) {
                flacList.add(workContents.get(i));

            }
            if (ImgManage.isImg(workContents.get(i))) {
                img.add(workContents.get(i));
            }

            if (ImgManage.isImg(workContents.get(i)) && (FileNameUtil.mainName(workContents.get(i)).equals("cover") || FileNameUtil.mainName(workContents.get(i)).equals("1"))) {
                imgCover = workContents.get(i);
            }
        }

        // 截取文件封面, 宽度自动, 高度500, 默认获取第一张图片作为歌曲封面
        if (imgCover == null) {
            imgCover = ImgManage.createImgCover(img.get(0).getPath(), FileManage.getPrePath(img.get(0).getPath()), 500);
        } else if (FileNameUtil.mainName(imgCover).equals("1")) {

            imgCover = ImgManage.createImgCover(imgCover.getPath(), FileManage.getPrePath(img.get(0).getPath()), 500);

        }


        // 根据歌曲和图片集合分类管理, 图片需要放在高画质文件夹, 音频不需要移动
        // 处理图片
        img = img.stream().filter(f -> !FileNameUtil.mainName(f).equals("cover")).collect(Collectors.toList());
        if (img.size() > 0) {
            String imgDir = FileManage.getPrePath(img.get(0).getPath()) + "高画质";
            for (int i = 0; i < img.size(); i++) {
                FileManage.copyToDestDir(img.get(i).getPath(), imgDir, img);
            }
            FileManage.delFileList(img);
        }

        // 设置歌曲封面
        SongManage.setFlacCover(flacList, imgCover);

        // 设置歌曲标签
        SongManage.setSongTags(flacList);

        System.out.println("分类成功: " + flacWorkSrc.getPath());
        System.out.println("作品: ----" + FileNameUtil.mainName(flacWorkSrc.getPath()) + "----");
        System.out.println();
        System.out.println();

    }
}
